package BloodTimeHybernateDO;

import java.sql.Date;
import java.util.ArrayList;
import java.util.List;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;

import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;
import org.hibernate.annotations.Proxy;

import dao.api.DataObject;

/**
 * 
 * @author Cesar A. Fuguet T.
 * 
 */

@Entity
@Table(name = "vampiro")
@Proxy(lazy = false)
public class VampiroDO implements DataObject {

    // -------------------------------
    // Identificador auto-incremental
    // -------------------------------

    private int id;

    // -----------------
    // Datos Personales
    // -----------------

    private String nombre;
    private String apellido;
    private String correo;
    private Date fechaNac;
    private String contrasenia;
    private boolean activo;

    // --------------------
    // Datos del personaje
    // --------------------

    private String alias;
    private byte[] imagen;
    private int fuerza;
    private int defensa;
    private int sigilosidad;
    private int velocidad;
    private int habArmas;
    private int habNegocios;
    private int ptosEntrenamiento;
    private int ptosExperiencia;
    private int salud;
    private int sangre;
    private float dinero;
    private int numEsclavos;

    // ------------
    // Referencias
    // ------------

    private FamiliaDO familiaId;
    private CiudadDO ciudadId;

    private List<VisitaDO> visitaList = new ArrayList<VisitaDO>();
    private List<VampiroArticuloDO> vampiroArticuloList = new ArrayList<VampiroArticuloDO>();
    private List<PropiedadVampiroDO> propiedadVampiroList = new ArrayList<PropiedadVampiroDO>();

    // ------------------------------------------------------------------------

    public VampiroDO() {
        // Empty
    }

    @Override
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "vampiro_sequence")
    @SequenceGenerator(sequenceName = "vampiro_sequence", name = "vampiro_sequence", allocationSize = 1)
    public int getId() {
        return id;
    }

    @Override
    public void setId(int id) {
        this.id = id;
    }

    // ---------------------------------------------------------------------------------------

    @ManyToOne
    public FamiliaDO getFamiliaId() {
        return familiaId;
    }

    public void setFamiliaId(FamiliaDO familiaId) {
        this.familiaId = familiaId;
    }

    // ---------------------------------------------------------------------------------------

    @ManyToOne
    public CiudadDO getCiudadId() {
        return ciudadId;
    }

    public void setCiudadId(CiudadDO ciudadId) {
        this.ciudadId = ciudadId;
    }

    // ---------------------------------------------------------------------------------------

    @OneToMany(mappedBy = "vampiroId")
    @LazyCollection(LazyCollectionOption.FALSE)
    @Cascade( { CascadeType.ALL, CascadeType.DELETE_ORPHAN })
    public List<VisitaDO> getVisitaList() {
        return visitaList;
    }

    public void setVisitaList(List<VisitaDO> visitaList) {
        this.visitaList = visitaList;
    }

    // ---------------------------------------------------------------------------------------

    @OneToMany(mappedBy = "vampiroId")
    @LazyCollection(LazyCollectionOption.FALSE)
    @Cascade( { CascadeType.ALL, CascadeType.DELETE_ORPHAN })
    public List<PropiedadVampiroDO> getPropiedadVampiroList() {
        return propiedadVampiroList;
    }

    public void setPropiedadVampiroList(List<PropiedadVampiroDO> propiedadVampiroList) {
        this.propiedadVampiroList = propiedadVampiroList;
    }

    // ---------------------------------------------------------------------------------------

    @OneToMany(mappedBy = "vampiroId")
    @LazyCollection(LazyCollectionOption.FALSE)
    @Cascade( { CascadeType.ALL, CascadeType.DELETE_ORPHAN })
    public List<VampiroArticuloDO> getVampiroArticuloList() {
        return vampiroArticuloList;
    }

    public void setVampiroArticuloList(List<VampiroArticuloDO> vampiroArticuloList) {
        this.vampiroArticuloList = vampiroArticuloList;
    }

    // ---------------------------------------------------------------------------------------

    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    // ---------------------------------------------------------------------------------------

    public String getApellido() {
        return apellido;
    }

    public void setApellido(String apellido) {
        this.apellido = apellido;
    }

    // ---------------------------------------------------------------------------------------

    public String getCorreo() {
        return correo;
    }

    public void setCorreo(String correo) {
        this.correo = correo;
    }

    // ---------------------------------------------------------------------------------------

    public Date getFechaNac() {
        return fechaNac;
    }

    public void setFechaNac(Date fechaNac) {
        this.fechaNac = fechaNac;
    }

    // ---------------------------------------------------------------------------------------

    public String getContrasenia() {
        return contrasenia;
    }

    public void setContrasenia(String contrasenia) {
        this.contrasenia = contrasenia;
    }

    // ---------------------------------------------------------------------------------------

    public String getAlias() {
        return alias;
    }

    public void setAlias(String alias) {
        this.alias = alias;
    }

    // ---------------------------------------------------------------------------------------

    public void setImagen(byte[] imagen) {
        this.imagen = imagen;
    }

    public byte[] getImagen() {
        return imagen;
    }

    // ---------------------------------------------------------------------------------------

    public int getFuerza() {
        return fuerza;
    }

    public void setFuerza(int fuerza) {
        this.fuerza = fuerza;
    }

    // ---------------------------------------------------------------------------------------

    public int getDefensa() {
        return defensa;
    }

    public void setDefensa(int defensa) {
        this.defensa = defensa;
    }

    // ---------------------------------------------------------------------------------------

    public int getSigilosidad() {
        return sigilosidad;
    }

    public void setSigilosidad(int sigilosidad) {
        this.sigilosidad = sigilosidad;
    }

    // ---------------------------------------------------------------------------------------

    public int getVelocidad() {
        return velocidad;
    }

    public void setVelocidad(int velocidad) {
        this.velocidad = velocidad;
    }

    // ---------------------------------------------------------------------------------------

    public int getHabArmas() {
        return habArmas;
    }

    public void setHabArmas(int habArmas) {
        this.habArmas = habArmas;
    }

    // ---------------------------------------------------------------------------------------

    public int getHabNegocios() {
        return habNegocios;
    }

    public void setHabNegocios(int habNegocios) {
        this.habNegocios = habNegocios;
    }

    // ---------------------------------------------------------------------------------------

    public int getPtosEntrenamiento() {
        return ptosEntrenamiento;
    }

    public void setPtosEntrenamiento(int ptosEntrenamiento) {
        this.ptosEntrenamiento = ptosEntrenamiento;
    }

    // ---------------------------------------------------------------------------------------

    public int getPtosExperiencia() {
        return ptosExperiencia;
    }

    public void setPtosExperiencia(int ptosExperiencia) {
        this.ptosExperiencia = ptosExperiencia;
    }

    // ---------------------------------------------------------------------------------------

    public int getSalud() {
        return salud;
    }

    public void setSalud(int salud) {
        this.salud = salud;
    }

    // ---------------------------------------------------------------------------------------

    public int getSangre() {
        return sangre;
    }

    public void setSangre(int sangre) {
        this.sangre = sangre;
    }

    // ---------------------------------------------------------------------------------------

    public float getDinero() {
        return dinero;
    }

    public void setDinero(float dinero) {
        this.dinero = dinero;
    }

    // ---------------------------------------------------------------------------------------

    public int getNumEsclavos() {
        return numEsclavos;
    }

    public void setNumEsclavos(int numEsclavos) {
        this.numEsclavos = numEsclavos;
    }

    // ---------------------------------------------------------------------------------------

    public boolean isActivo() {
        return activo;
    }

    public void setActivo(boolean activo) {
        this.activo = activo;
    }
}
